<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>作用域</title>
</head>
<body>
<h3> 作用域</h3>
<p>
通常来说，一段程序代码中所用到的名字并不总是有效和可用的，<br>
而限定这个名字的 可用性的代码范围 就是这个名字的, 作用域。
</p>
<h4>全局作用域</h4>
<p>
作用于所有代码执行的环境(整个 script 标签内部)<br>
或者一个独立的 js 文件
</p>
<h4>局部作用域</h4>
<p>
作用于函数内的代码环境，就是 局部作用域。 <br>
因为跟函数有关系， 所以也称为函数作用域
</p>
<hr>

<h3>在JavaScript中，根据作用域的不同，变量可以分为：</h3>
<h4>全局变量</h4>
<p>
全局变量在任何区域都 <br>
可以访问和修改
</p>
<h4>局部变量 (即 函数内部let的变量)</h4>
<p>
局部变量只能在当前 函数内部访问和修改
</p>
<hr>

<h2>变量有一个坑， 特殊情况：</h2>
<p>
如果函数内部，变量没有声明，直接赋值，也当 全局变量 看，但是强烈不推荐 <br>
但是有一种情况，函数内部的形参可以看做是局部变量。
</p>
<hr>
<h1>变量的访问原则</h1>
<p>
只要是代码，就至少有一个作用域 <br> <br>

写在函数内部的局部作用域 <br>
如果函数中还有函数，那么在这个作用域中就又可以诞生一个作用域 <br><br>

访问原则：在能够访问到的情况下 先局部， 局部没有在找全局

<a href="https://www.bilibili.com/video/BV1Y84y1L7Nn/?p=58&spm_id_from=pageDriver&vd_source=cb928a955f1123af004a2e3158113ea7">
    变量的访问原则 视频说明 5:50
</a>
</p>

<script>
    function fn() {
        // 这里变量在函数里, 但是没有使用 let 声明变量
        num = 10  // 这种变量没有声明中间赋值, 是全局变量来看  强烈不允许
    }

    fn() // 调用函数, 在输出 变量
    console.log(num) // 可以输出信息, 证明这个变量是全局变量

    // ------变量的访问规则-------------
    let 数 = 10
    function 函数1() {
        let 数 = 20
        function 函数1_函数() {
            let 数 = 30
            console.log(`数字是: ${数}`)
        }
        函数1_函数()
    }

    函数1() // 调用函数, 把 数 从里依次注释掉, 看看控制台信息
</script>
</body>
</html>